/**
 * 根据 ECMAScript 规范，这个符号作为一个属性表示“一个布尔值，如果是 true，
 * 则意味着对象应该用 Array.prototype.concat()打平其数组元素”。
 * ES6 中的 Array.prototype.concat()方法会根 据 接 收 到 的 对 象 类 型 选 择 如 何 将 一 个 类 数 组 对 象 拼 接 成 数 组 实 例 。
 * 覆 盖 Symbol.isConcatSpreadable 的值可以修改这个行为。
 */
let initial = ['foo']
let array = ['bar']

console.log(array[Symbol.isConcatSpreadable]) // undefined
console.log(initial.concat(array)) // ['foo', 'bar']
array[Symbol.isConcatSpreadable] = false
console.log(initial.concat(array)) // [ 'foo', [ 'bar', [Symbol(Symbol.isConcatSpreadable)]: false ] ]
let arrayLikeObject = { length: 1, 0: 'baz' }
console.log(arrayLikeObject[Symbol.isConcatSpreadable]) // undefined
console.log(initial.concat(arrayLikeObject)) // [ 'foo', { '0': 'baz', length: 1 } ]
arrayLikeObject[Symbol.isConcatSpreadable] = true
console.log(initial.concat(arrayLikeObject)) // [ 'foo', 'baz' ]

let otherObject = new Set().add('qux')
console.log(otherObject[Symbol.isConcatSpreadable]) // undefined
console.log(initial.concat(otherObject)) // [ 'foo', Set(1) { 'qux' } ]
otherObject[Symbol.isConcatSpreadable] = true
console.log(initial.concat(otherObject)) // [ 'foo' ]
